package com.tinshow.config.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Date;
import java.util.Properties;

/**
 * Created by libo4 on 2017/6/14.
 */
public class MailUtil {

    public static final String QQ_ADDRESS = "mail.qq.com";
    public static final String NETEASY_163_ADDRESS = "mail.163.com";
    public static final String GMAIL_ADDRESS = "mail.google.com";
    public static final String SINA_ADDRESS = "mail.sina.com.cn";
    public static final String OUTLOOK_ADDRESS = "outlook.live.com";
    public static final String NETEASY_126_ADDRESS = "mail.126.com";
    public static final String ALIYUN_ADDRESS = "mail.aliyun.com";

    @Value("${spring.mail.username}")
    private static String userName;

    @Autowired
    private static JavaMailSender javaMailSender;

    public static String sendMail() throws  Exception{
        Properties props = new Properties();
        // 开启debug调试
        props.setProperty("mail.debug", "true");
        // 发送服务器需要身份验证
        props.setProperty("mail.smtp.auth", "true");
        // 设置邮件服务器主机名
        props.setProperty("mail.host", "smtp.tinshow.com");
        // 发送邮件协议名称
        props.setProperty("mail.transport.protocol", "smtp");

        // 设置环境信息
        Session session = Session.getInstance(props);

        // 创建邮件对象
        Message msg = new MimeMessage(session);
        msg.setSubject("JavaMail测试");
        // 设置邮件内容
        msg.setText("这是一封由JavaMail发送的邮件！");
        // 设置发件人
        msg.setFrom(new InternetAddress("open@tinshow.com"));

        Transport transport = session.getTransport();
        // 连接邮件服务器
        transport.connect("open@tinshow.com", "eyen2017@qq.com");
        // 发送邮件
        transport.sendMessage(msg, new Address[] {new InternetAddress("474740448@qq.com")});
        // 关闭连接
        transport.close();
        return null;
    }

    public static void main(String[] args) {
        try {
            MailSenderInfo mailInfo = new MailSenderInfo();
            mailInfo.setSubject("设置邮箱标题");
            mailInfo.setContent("<a href='http://www.baidu.com'>设置邮箱内容</a>");
            mailInfo.setToAddress("474740448@qq.com");
            //这个类主要来发送邮件
            sendHtmlMail(mailInfo);//发送html格式
            System.out.println("发送成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 以HTML格式发送邮件
     * @param mailInfo 待发送的邮件信息
     */
    public static boolean sendHtmlMail(MailSenderInfo mailInfo) throws Exception{
        // 判断是否需要身份认证
        MailAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        //如果需要身份认证，则创建一个密码验证器
        if (mailInfo.isValidate()) {
            authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getInstance(pro,authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址，并设置到邮件消息中
            Address to = new InternetAddress(mailInfo.getToAddress());
            // Message.RecipientType.TO属性表示接收者的类型为TO
            mailMessage.setRecipient(Message.RecipientType.TO,to);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // MiniMultipart类是一个容器类，包含MimeBodyPart类型的对象
            Multipart mainPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 设置HTML内容
            html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
            mainPart.addBodyPart(html);
            // 将MiniMultipart对象设置为邮件内容
            mailMessage.setContent(mainPart);
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }
}
